Hello呀,這是一個培養寫程式習慣的練習。
先前有試著每天學習一次線上課程,但學到後面就忘記前面,
自省缺少學習記錄,也沒有養成每天寫程式的習慣。
所以這次換個方式:每日固定的課程加學習記錄整理及分享。
看看是否比較能培養出寫程式的習慣
目前鎖定的練習標的物是 100天從新手到大師
歡迎各位前輩指導!!在此先謝謝了!
1. 心得
1.解一個題目可以分為四個步驟:
a.理解題意 b.寫下解題步驟 c.轉換為偽代碼 d.寫出程式碼
程式不會寫的可分為兩種,一種是思路未想透徹,另一種是不會寫程式碼。
先釐清自己是卡在哪一個環節比較好對症下藥。
2.這一次有試著將看到題目的思路寫下來,我想多思考多記錄會有幫助的。
在寫思路的時候就知道,有些題目是連思路都還沒想出來就卡住。
小語
決不能放棄,世界上沒有失敗,只有放棄。
2. 本日學習摘要
Day05 - 構造程序邏輯
經典案例:水仙花數/ 百錢百雞/ Craps賭博遊戲
練習題目:斐波那契數列/ 完美數/ 質數
3. 程式碼
#尋找所有水仙花數
"""
說明:水仙花數也被稱為超完全數字不變數、自戀數、自冪數、阿姆斯特朗數,
它是一個3位數,該數字每個位上數字的立方之和正好等於它本身,
例如: 1^3 + 5^3+ 3^3=153。
"""
"""
思路
Step1.定義範圍 Range(100,1000)
Step2.拆解個位數(c)、十位數(b)、百位數(a)
Setp3.設定方程式 a^3 + b^3 + c^3 = a*100 + b*10 + c*1
"""
for num in range(100,1000,1):
low = num % 10
mid = num // 10 % 10
high = num // 100
if num == low ** 3 + mid ** 3 + high ** 3:
print(num)
#正整數的反轉
"""
例如12345經過程式後變為54321
"""
"""
思路
Step1.使用者輸入正整數
Step2.定義反轉數=0
Step3.正整數除以10取餘數,放入反轉數
Step4.
使用while迴圈,當正整數大於零,則反轉數 = 反轉數*10 + 正整數除以10的餘數
"""
num = int(input('請輸入正整數:'))
reverse_num = 0
while num > 0:
reverse_num = reverse_num *10 + num % 10
print(reverse_num,num)
num //= 10
print(num)
print(reverse_num)
#百元百雞
"""
公雞一隻5元、母雞一隻3元、小雞三隻一元
用一百元買一百隻雞,請問公雞、母雞、小雞各幾隻
"""
"""
思路
step1. 聯立方程式
5a + 3b + c/3 = 100
a + b + c = 100
step2. a的範圍為0~20 (用range)
b的範圍為0~33 (用range)
step3. c可寫為 100 - a - b
step4 當 5a + 3b + c/3 == 100時,就是答案
"""
for a in range(0,20):
for b in range(0,33):
c = 100 - a - b
if 5 * a + 3 * b + c / 3 == 100:
print("公雞:%d隻,母雞:%d隻,小雞:%d隻" %(a,b,c))
#CRAPS賭博遊戲
"""
玩家第一次搖骰子如果搖出了7點或11點,玩家勝;
玩家第一次如果搖出2點、3點或12點,莊家勝;
其他點數玩家繼續搖骰子,如果玩家搖出了7點,
莊家勝;如果玩家搖出了第一次搖的點數,
玩家勝;其他點數,玩家繼續要骰子,直到分出勝負。
"""
"""
設定玩家開始遊戲時有1000元
遊戲結束條件是玩家輸光所有賭注
"""
from random import randint
money = 1000
while money > 0 :
print("你的總資產:", money)
needs_go_on = False
while True:
debt = int (input ("請下注:"))
if 0 < debt <= money:
break
first = randint(1,6 ) + randint(1,6)
print("玩家搖出%d點" %first)
if first == 7 or first == 11:
print("玩家勝!")
money += debt
elif first == 2 or first == 3 or first == 12:
print("莊家勝!")
money -= debt
else:
needs_go_on = True
while needs_go_on :
needs_go_on = False
current = randint(1,6) + randint(1,6)
print("玩家搖出了%d點" %current)
if current == 7:
print('莊家勝')
money -= debt
elif current == first:
print('玩家勝')
money += debt
else:
needs_go_on = True
print("你破產了,遊戲結束")
#練習:生成斐波那契數列的前20個數。
"""
斐波那契數列的特點是數列的前兩個數都是1,從第三個數開始,
每個數都是它前面兩個數的和,形如:1, 1, 2, 3, 5 , 8, 13, 21, 34, 55, 89, 144
"""
"""
思路
step1. 定義數學式 A(n) + A(n+1) = A(n+2)
step2. A(n) = 1, A(n+1) = 1
step3. for 迴圈進行20次
step4. print A(n+2)
"""
count = 0
An = 1
An2 = 1
print(An)
print(An2)
while count < 18:
count = count + 1
Anew = An + An2
An = An2
An2 = Anew
print(Anew)
continue
#練習:找出10000以內的完美數。
"""
所有的真因子(即除了自身以外的因子)的和(即因子函數)恰好等於它本身。
例如:6($6=1+2+3$)和28($28=1+2+4+7+14$)就是完美數。
"""
import math
for num in range(1, 10000):
result = 0
for factor in range(1, int(math.sqrt(num)) + 1):
if num % factor == 0:
result += factor
if factor > 1 and num // factor != factor:
result += num // factor
if result == num:
print(num)
![6](https://ithelp.ithome.com.tw/upload/images/20200505/20126777huSmE80tWP.jpg)
#輸出100以內所有的質數。
from math import sqrt
for num in range(2, 101):
end = int(sqrt(num))
is_prime = True
for x in range(2, end+1):
if num % x == 0 :
is_prime = False
break
if is_prime and num != 1:
print(num)
參考資料:Day05